﻿/*!
* Ext JS Library 3.2.1
* Copyright(c) 2006-2010 Ext JS, Inc.
* licensing@extjs.com
* http://www.extjs.com/license
*/
/**
* @class Ext.ux.TabCloseMenu
* @extends Object 
* Plugin (ptype = 'tabclosemenu') for adding a close context menu to tabs. Note that the menu respects
* the closable configuration on the tab. As such, commands like remove others and remove all will not
* remove items that are not closable.
* 
* @constructor
* @param {Object} config The configuration options
* @ptype tabclosemenu
*/
Ext.ux.TabCloseMenu = Ext.extend(Object, {
    /**
    * @cfg {String} closeTabText
    * The text for closing the current tab. Defaults to <tt>'Close Tab'</tt>.
    */
    closeTabText: '关闭当前标签',

    /**
    * @cfg {String} closeOtherTabsText
    * The text for closing all tabs except the current one. Defaults to <tt>'Close Other Tabs'</tt>.
    */
    closeOtherTabsText: '关闭其它标签',

    /**
    * @cfg {Boolean} showCloseAll
    * Indicates whether to show the 'Close All' option. Defaults to <tt>true</tt>. 
    */
    showCloseAll: true,

    /**
    * @cfg {String} closeAllTabsText
    * <p>The text for closing all tabs. Defaults to <tt>'Close All Tabs'</tt>.
    */
    closeAllTabsText: '关闭全部标签',

    constructor: function (config) {
        Ext.apply(this, config || {});
    },

    //public
    init: function (tabs) {
        this.tabs = tabs;
        tabs.on({
            scope: this,
            contextmenu: this.onContextMenu,
            destroy: this.destroy
        });
    },

    destroy: function () {
        Ext.destroy(this.menu);
        delete this.menu;
        delete this.tabs;
        delete this.active;
    },

    // private
    onContextMenu: function (tabs, item, e) {
        this.active = item;
        var m = this.createMenu(),
            disableAll = true,
            disableOthers = true,
            closeAll = m.getComponent('closeall');

        m.getComponent('close').setDisabled(!item.closable);
        tabs.items.each(function () {
            if (this.closable) {
                disableAll = false;
                if (this != item) {
                    disableOthers = false;
                    return false;
                }
            }
        });
        m.getComponent('closeothers').setDisabled(disableOthers);
        if (closeAll) {
            closeAll.setDisabled(disableAll);
        }

        e.stopEvent();
        m.showAt(e.getPoint());
    },

    createMenu: function () {
        if (!this.menu) {
            var items = [{
                itemId: 'close',
                iconCls: 'icon-tabclose',
                text: this.closeTabText,
                scope: this,
                handler: this.onClose
            }];
            if (this.showCloseAll) {
                items.push('-');
            }
            items.push({
                itemId: 'closeothers',
                iconCls: 'icon-tabclose',
                text: this.closeOtherTabsText,
                scope: this,
                handler: this.onCloseOthers
            });
            if (this.showCloseAll) {
                items.push({
                    itemId: 'closeall',
                    iconCls: 'icon-tabclose',
                    text: this.closeAllTabsText,
                    scope: this,
                    handler: this.onCloseAll
                });
            }
            this.menu = new Ext.menu.Menu({
                items: items
            });
        }
        return this.menu;
    },

    onClose: function () {
        this.tabs.remove(this.active);
    },

    onCloseOthers: function () {
        this.doClose(true);
    },

    onCloseAll: function () {
        this.doClose(false);
    },

    doClose: function (excludeActive) {
        var items = [];
        this.tabs.items.each(function (item) {
            if (item.closable) {
                if (!excludeActive || item != this.active) {
                    items.push(item);
                }
            }
        }, this);
        Ext.each(items, function (item) {
            this.tabs.remove(item);
        }, this);
    }
});

Ext.preg('tabclosemenu', Ext.ux.TabCloseMenu);